package com.zxy.shaozhiyi1.main;


import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PushbackInputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;

import org.apache.poi.POIXMLDocument;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.openqa.selenium.By;
import org.openqa.selenium.By.ById;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.Test;

import com.zxy.shaozhiyi1.util.excel.ExcelUtil;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

public class Zidonghua1
{
	public WebDriver driver = null;
	public WebElement webelement = null;
	
	/**
	 * 全自动化接口
	 * 自动化程度：70%
	 * 开发状态：开发中
	 * 难度等级：3.5（1----5个等级）
	 * 
	 * @throws InterruptedException
	 * @throws IOException
	 */
	@Test(invocationCount = 1)
	public void zidonghua1() throws InterruptedException, IOException
	{
		// 检索页
		String url = Constant.URL;
		
		// 3次尝试机会
		int openSearchPachCount = 0;
		while(true)
		{
			// testNG打开检索页
			openSearchPage(url);
			
			// 判断是否如期打开了检索页 TODO
			boolean isSuccessOpenSearchPage = isSuccessOpenSearchPage();
			if(isSuccessOpenSearchPage)
			{
				// 如期打开了检索页的话
				
				// 退出循环，继续执行
				break;
			}
			else
			{
				// 没有如期打开检索页的话
				
				// 进行3次尝试
				// 尝试机会-1
				openSearchPachCount++;
				if(openSearchPachCount < 3)
				{
					// 给出警告提示
					System.out.println("程序开始为你进行第" + openSearchPachCount + "次尝试，尝试重新帮你打开指定的搜索页");
				}
				if(openSearchPachCount == 3)
				{
					// 如果3次尝试都没有如期打开，则给出最终警告提示，给出建议解决方案，退出程序。
					System.out.println("程序已经重新尝试了3次来帮你打开指定的搜索页，但是都没有成功，请检查网络是否正常，确认配置是否正确！");
					
					// 程序退出
					return;
				}
				
				// 休息0.5s
				Thread.sleep(500);
			}
		}
		
		// 如期打开检索页的前提下
		// 程序能走到这里，肯定也正确打开了检索页
		
		// 给>=10=s的充足输入时间
		Thread.sleep(1000);
		
		while(true)
		{
			// 判断是否打开了dataGrid结果页 TODO
			boolean isOpenResultPage = isOpenResultPage();
			if(isOpenResultPage == true)
			{
				// 打开了dataGrid结果页的话
				
				// 循环判断是否打开了正确的dataGrid结果页
				while(true)
				{
					// TODO:封装为一个方法，改方法返回3个字符串，yes代表正确的结果页，no代表非正确的结果页，"meiyourenweicaozuo"代表一种半正确状态
					boolean isOpenCorrectResultPage = isOpenCorrectResultPage();
					if(isOpenCorrectResultPage)
					{
						// 如果是正确的结果页的话
						
						// 取出结果页中dataGrid中的数据，持久化到数据库中 TODO:必须进行封装
						
						// 给>=10=s的充足输入时间
						Thread.sleep(10000);
						
						// 继续循环判断
						continue;
						
						// 取数据存数据完毕后，跟上面的没有人为操作分支一样，
						// 继续返回到上一个while循环中继续判断，判断结果页是不是正确的结果页
					}
					else
					{
						// 如果不是正确的结果页的话
						
						// 判断是   1无人为操作结果页   还是   2不正确结果页
						String isNoOperationResultPageOrWrongResultPage = isNoOperationResultPageOrWrongResultPage();
						if("noOperationResultPage".equals(isNoOperationResultPageOrWrongResultPage))
						{
							// 无人为操作结果页的话
							
							// 休息1s
							Thread.sleep(1000);
							
							// 继续判断
							continue;
						}
						else
						{
							// 不正确结果页的话
							
							// 给出警告提示：a.人工操作上与程序冲突   b.数据在服务端有刷新
							System.out.println("警告提示：a.人工操作上与程序冲突   b.数据在服务端有刷新，请检查！");
							
							// 结束
							return;
						}
					}
				}
			}
			else
			{
				// 没有打开dataGrid结果页的话
				
				// 休息1s
				Thread.sleep(1000);
				
				// 继续while循环判断
				continue;
			}
		}
	}
	
	/**
	 * testNG打开检索页
	 */
	private void openSearchPage(String url)
	{
		// Google浏览器
		// 经实际对比效果，Google浏览器较为稳定
		System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
		WebDriver driver = new ChromeDriver();
		driver.get(url);
		System.out.println("Page Title is " + driver.getTitle());
		// AssertJUnit.assertEquals("Google", driver.getTitle());
	}
	
	/**
	 * 判断是否如期打开了检索页
	 */
	private boolean isSuccessOpenSearchPage()
	{
		boolean result = false;
		
		// 判断特定DOM元素有没有被加载
		// 确定合适的判断DOM元素是：TODO
		if(false)
		{
			// 元素存在
			
			result = true;
		}
		else
		{
			// 元素不存在
			
			result = false;
		}
		
		
		
		return result;
	}
	
	/**
	 * 判断是否如期打开了dataGrid结果页
	 */
	private boolean isOpenResultPage()
	{
		boolean result = false;
		
		// 判断特定DOM元素有没有被加载
		// 确定合适的判断DOM元素是：TODO
		if(false)
		{
			// 元素存在
			
			result = true;
		}
		else
		{
			// 元素不存在
			
			result = false;
		}
		
		
		
		return result;
	}
	
	/**
	 * 判断是否打开了正确的dataGrid结果页
	 */
	private boolean isOpenCorrectResultPage()
	{
		boolean result = false;
		
		// 判断特定DOM元素有没有被加载
		// 确定合适的判断DOM元素是：TODO
		if(false)
		{
			// 元素存在
			
			result = true;
		}
		else
		{
			// 元素不存在
			
			result = false;
		}
		
		return result;
	}
	
	
	/**
	 * 判断是   1无人为操作结果页   还是   2不正确结果页
	 * @return
	 */
	private String isNoOperationResultPageOrWrongResultPage()
	{
		if(true)
		{
			return "noOperationResultPage";
		}
		else
		{
			return "wrongResultPage";
		}
	}
	
	
	

	/**
	 * excel导出
	 * 
	 * @param filePath 输出的文件
	 * @param headMap 表头
	 * @param jsonArray 表体
	 * @param rowIndex 起始行
	 * @param colWidth 列宽
	 * @param datePattern 日期格式
	 * @param pageNo 页号
	 */
	private void excel(String filePath, Map<String, String> headMap, JSONArray jsonArray, 
			           int rowIndex, int colWidth, String datePattern)
	{
		// 输出流
		try {
			FileInputStream fileInputStream = new FileInputStream(filePath);
			Workbook workbook = getWorkbook(fileInputStream);
			
			/*Row row = sheet1.createRow(sheet1.getLastRowNum() + 1);
			row.setHeightInPoints((short) 25);
			// 给这一行赋值
			row.createCell(0).setCellValue("12");
			row.createCell(1).setCellValue("23");
			FileOutputStream os = new FileOutputStream(filePath);
			workbook.write(os);
			fileInputStream.close();
			os.close();

			FileInputStream is2 = new FileInputStream(filePath);
			Workbook wb2 = getWorkbook(is2);
			System.out.println("aaa");
			Sheet sheet12 = wb2.getSheetAt(0);
			System.out.println(sheet12.getLastRowNum());
			Row row2 = sheet12.createRow(sheet12.getLastRowNum() + 1);
			row2.setHeightInPoints((short) 25);
			// 给这一行赋值
			row2.createCell(0).setCellValue("12");
			row2.createCell(1).setCellValue("23");
			FileOutputStream os2 = new FileOutputStream(filePath);
			wb2.write(os2);
			is2.close();
			os2.close();*/
			
			
			Sheet sheet = workbook.getSheetAt(0);
			System.out.println("最后一行的行号是：  " + sheet.getLastRowNum());
			
			// 列头样式
			HSSFCellStyle headerStyle = (HSSFCellStyle) workbook.createCellStyle();
			headerStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
			headerStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
			headerStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
			headerStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
			headerStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
			headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
			HSSFFont headerFont = (HSSFFont) workbook.createFont();
			headerFont.setFontHeightInPoints((short) 12);
			headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
			headerStyle.setFont(headerFont);
			
			// 设置列宽
			int minBytes = colWidth < Constant.DEFAULT_COLOUMN_WIDTH ? Constant.DEFAULT_COLOUMN_WIDTH : colWidth;// 至少字节数
			int[] arrColWidth = new int[headMap.size()];
			
			// 产生表格标题行,以及设置列宽
			String[] properties = new String[headMap.size()];
			String[] headers = new String[headMap.size()];
			int ii = 0;
			for (Iterator<String> iter = headMap.keySet().iterator(); iter.hasNext();) {
				String fieldName = iter.next();

				properties[ii] = fieldName;
				headers[ii] = fieldName;

				// 设置列宽
				int bytes = fieldName.getBytes().length;
				arrColWidth[ii] = bytes < minBytes ? minBytes : bytes;
				sheet.setColumnWidth(ii, arrColWidth[ii] * 256);
				ii++;
			}
			
			// 单元格样式
			HSSFCellStyle cellStyle = (HSSFCellStyle) workbook.createCellStyle();
			cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
			cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
			cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
			cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
			cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
			cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
			HSSFFont cellFont = (HSSFFont) workbook.createFont();
			cellFont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
			cellStyle.setFont(cellFont);
			
			boolean bl = false;
			int qishihang = -1;
			// 遍历集合数据，产生数据行
			for (Object obj : jsonArray)
			{
				// 产生表头
				if (rowIndex == 65535 || rowIndex == 0)
				{
					if (rowIndex != 0)
					sheet = workbook.createSheet();// 如果数据超过了，则在第二页显示
					
//					sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, headMap.size() - 1));
					// 列头
//					HSSFRow headerRow = (HSSFRow) sheet.createRow(rowIndex);
					/*HSSFRow headerRow = (HSSFRow) sheet1.createRow(sheet1.getLastRowNum() + 1);
					for (int i = 0; i < headers.length; i++)
					{
						headerRow.createCell(i).setCellValue(headers[i]);
						headerRow.getCell(i).setCellStyle(headerStyle);

					}*/
					// rowIndex = 2;//数据内容从 rowIndex=2开始
//					rowIndex++;
				}
				
				if (datePattern == null)
					datePattern = Constant.DEFAULT_DATE_PATTERN;
				
				// JSONObject jo = (JSONObject) JSONObject.toJSON(obj);
				JSONObject jsonObject = JSONObject.fromObject(obj);
//				HSSFRow dataRow = (HSSFRow) sheet.createRow(rowIndex);
				int lashRowNum = sheet.getLastRowNum();
				System.out.println("最后一行的行号是：----------：" + lashRowNum);
				HSSFRow dataRow;
				if(lashRowNum == 0 && qishihang == -1)
				{
					dataRow = (HSSFRow) sheet.createRow(lashRowNum);
				}
				else
				{
					dataRow = (HSSFRow) sheet.createRow(lashRowNum + 1);
				}
				qishihang++;
				
				
//				HSSFRow dataRow = (HSSFRow) sheet1.createRow(sheet1.getLastRowNum() + 1);
				
				for (int i = 0; i < properties.length; i++)
				{
					HSSFCell newCell = dataRow.createCell(i);

					Object o = jsonObject.get(properties[i]);
					String cellValue = "";
					if (o == null)
						cellValue = "";
					else if (o instanceof Date)
						cellValue = new SimpleDateFormat(datePattern).format(o);
					else
						cellValue = o.toString();

					newCell.setCellValue(cellValue);
					
					newCell.setCellStyle(cellStyle);
				}
				rowIndex++;
			}
			
			FileOutputStream fileOutputStream = new FileOutputStream(filePath);
			workbook.write(fileOutputStream);
			fileInputStream.close();
			fileOutputStream.close();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	private static Workbook getWorkbook(InputStream is) throws IOException {
		Workbook wb = null;
		if (!is.markSupported()) {
			is = new PushbackInputStream(is, 8);
		}
		if (POIFSFileSystem.hasPOIFSHeader(is)) { // Excel2003及以下版本
			wb = (Workbook) new HSSFWorkbook(is);
		} else if (POIXMLDocument.hasOOXMLHeader(is)) { // Excel2007及以上版本
			wb = new XSSFWorkbook(is);
		} else {
			throw new IllegalArgumentException("你的Excel版本目前poi无法解析！");
		}
		// }
		return wb;
	}
}